﻿jQuery.fn.Pager = function(config) {
    //debugger;
    init("#" + this.attr("id"), config);
}

function init(t, config) {
    //公有变量
    var dataStore = config.dataStore; 																														//数据
    var totalRecord = config.totalRecord > 0 ? config.totalRecord : 0; 																//总记录数
    //    if (totalRecord == 0) {
    //        $(t).css("text-align", "center");
    //        $(t).css("line-height", "50px");
    //        $(t).html("很遗憾，没有检索到任何记录！");
    //        return;
    //    }
    var configPage = config.perPage > 0 ? config.perPage : 10;
    var perPage = $.cookie(t + "_perPage") == null ? 10 : parseInt($.cookie(t + "_perPage")); 			//每页显示记录数
    var proxyUrl = config.proxyUrl; //> 0 ? config.proxyUrl : 'pgdataproxy.jsp';															//数据代理地址
    var groupSize = config.groupSize; 																															//组大小
    var barPosition = config.barPosition == null ? 'bottom' : config.barPosition; 												//工具条位置
    var ajaxParam = config.ajaxParam; 																															//ajax的请求参数
    var showMode = config.showMode == null ? 'full' : config.showMode; 														//显示模式
    onSetData = config.onSetData;

    //私有变量
    var totalPage = Math.ceil(totalRecord / perPage); 																								//总页数
    var currentPage = $.cookie(t + "_currentPage") == null ? 1 : parseInt($.cookie(t + "_currentPage")); 			//当前页码
    currentPage = currentPage == 0 ? 1 : currentPage;
    var startRecord; 																																							//每页起始记录
    var endRecord;  																																							//每页结束记录
    var gpStartPage;
    var gpEndPage;
    var gpStartRecord;
    var gpEndRecord;

    //数据容器
    var container = ''

    //添加工具条
    var toolbar = '<div class="pgToolbar">';
    toolbar += '<div class="pgPanel">';
    if (showMode == 'full') {
        toolbar += '<div><select class="pgPerPage">';
        if (config.perPage > 0)
            toolbar += '<option value="' + config.perPage + '">' + config.perPage + '</option>';
        toolbar += '<option value="5">5</option>';
        toolbar += '<option value="10">10</option>';
        toolbar += '<option value="15">15</option>';
        toolbar += '<option value="20">20</option>';
        toolbar += '<option value="25">25</option>';
        toolbar += '<option value="40">40</option>';
        toolbar += '</select>&nbsp;</div>';
        toolbar += '<div class="separator"></div>';
    }
    toolbar += '<div class="pgBtn pgFirst" title="首页"></div>';
    toolbar += '<div class="pgBtn pgPrev" title="上页"></div>';
    if (showMode != 'mini') {
        toolbar += '<div class="separator"></div>';
        toolbar += '<div>第 <input class="pgCurrentPage" type="text" value="' + currentPage + '" title="页码" /> 页 / 共 <span class="pgTotalPage">' + totalPage + '</span> 页</div>';
        toolbar += '<div class="separator"></div>';
    }
    toolbar += '<div class="pgBtn pgNext" title="下页"></div>';
    toolbar += '<div class="pgBtn pgLast" title="尾页"></div>';
    if (groupSize) {
        toolbar += '<div class="separator"></div>';
        toolbar += '<div class="pgBtn pgRefresh" title="刷新"></div>';
    }
    if (showMode == 'full') {
        toolbar += '<div class="separator"></div>';
        toolbar += '<div class="pgSearchInfo">检索到&nbsp;' + totalRecord + '&nbsp;条记录，显示第&nbsp;<span class="pgStartRecord">' + startRecord + '</span>&nbsp;条&nbsp;-&nbsp;第&nbsp;<span class="pgEndRecord">' + endRecord + '</span>&nbsp;条记录</div>';
    }
    toolbar += '<hr class="cleanFloat" /></div>';
    toolbar += '</div>';

    if (perPage < totalRecord)
        switch (barPosition) {
        case 'top':
            $(t).html(toolbar + container);
            break;
        case 'bottom':
            $(t).html(container + toolbar);
            break;
        default:
            $(t).html(toolbar + container + toolbar);
    }
    else
        $(t).html(container);

    var btnRefresh = $(t + " .pgRefresh"); 													//刷新按钮
    var btnNext = $(t + " .pgNext"); 																//下一页按钮
    var btnPrev = $(t + " .pgPrev"); 																//上一页按钮
    var btnFirst = $(t + " .pgFirst"); 																//首页按钮
    var btnLast = $(t + " .pgLast"); 																//末页按钮
    var btnGo = $(t + " .pgNext," + t + " .pgLast");
    var btnBack = $(t + " .pgPrev," + t + " .pgFirst");
    var btn = $(t + " .pgFirst," + t + " .pgPrev," + t + " .pgNext," + t + " .pgLast");
    var mask;

    var valCurrentPage = $(t + " .pgCurrentPage");
    var valStartRecord = $(t + " .pgStartRecord");
    var valEndRecord = $(t + " .pgEndRecord");
    var valContainer = $(t + " .pgContainer");
    var valPerPage = $(t + " .pgPerPage");
    var valTotalPage = $(t + " .pgTotalPage");

    $(t + " .pgPerPage").attr("value", perPage);
    getGroupStartEnd();
    getStartEnd();
    if (dataStore == null) {
        if (currentPage >= totalPage) currentPage = totalPage;
        getRemoteData();
    }
    else {
        getStartEnd();
        loadData();
        refresh();
    }

    //刷新按钮监听
    btnRefresh.bind("mousedown", pressHandler).bind("mouseup", unpressHandler).bind("mouseout", unpressHandler);

    //刷新工具栏
    refresh();

    //按钮监听
    btnNext.click(
		function() {
		    //debugger;
		    if (currentPage < totalPage) {
		        //		        if (!dataStore) {
		        currentPage += 1;
		        //		            getGroupStartEnd();
		        //		            getStartEnd();
		        getRemoteData();
		        //		        } else {
		        //		            currentPage += 1;
		        //		            getStartEnd();
		        //		            loadData();
		        refresh();
		        //		        }
		    }
		}
	);
    btnPrev.click(
		function() {
		    if (currentPage > 1) {
		        //if(!dataStore || currentPage == gpStartPage){
		        currentPage -= 1;
		        //getGroupStartEnd();
		        //getStartEnd();
		        getRemoteData();
		        //				}else{
		        //					currentPage -= 1;
		        //					getStartEnd();
		        //					loadData();
		        refresh();
		        //				}
		    }
		}
	);
    btnFirst.click(
		function() {
		    //			if(!dataStore || currentPage > 1){
		    //				if(gpStartPage > 1){
		    currentPage = 1;
		    //					getGroupStartEnd();
		    //					getStartEnd();
		    getRemoteData();
		    //				}else{
		    //					currentPage = 1;
		    //					getStartEnd();
		    //					loadData();
		    refresh();
		    //				}
		    //			}
		}
	);
    btnLast.click(
		function() {
		    //			if(!dataStore || currentPage < totalPage){
		    //				if(gpEndPage > 0 && gpEndPage < totalPage){
		    currentPage = totalPage;
		    //					getGroupStartEnd();
		    //					getStartEnd();
		    getRemoteData();
		    //				}else{
		    //					currentPage = totalPage;
		    //					getStartEnd();
		    //					loadData();
		    refresh();
		    //				}
		    //			}
		}
	);
    btnRefresh.click(
		function() {
		    getGroupStartEnd();
		    getStartEnd();
		    getRemoteData();
		}
	);

    //页码输入框监听
    valCurrentPage.keyup(
		function() {
		    //debugger;
		    var targetPage = parseInt($(this).val());
		    if (targetPage >= 1 && targetPage <= totalPage) {
		        //if(!dataStore || gpStartPage > targetPage || (gpEndPage > 0 && gpEndPage < targetPage)){
		        currentPage = targetPage;
		        //	getGroupStartEnd();
		        //	getStartEnd();
		        getRemoteData();
		        //				}else{
		        //					currentPage = targetPage;
		        //					getStartEnd();
		        //					loadData();
		        refresh();
		        //				}
		    }
		}
	);

    valPerPage.change(
		function() {
		    perPage = parseInt($(this).val());
		    currentPage = 1;
		    totalPage = Math.ceil(totalRecord / perPage);
		    if (groupSize) {
		        getGroupStartEnd();
		        getStartEnd();
		        getRemoteData();
		    } else {
		        getStartEnd();
		        loadData();
		        refresh();
		    }
		}
	);

    /*********************************init私有函数***************************************************/
    /**
    * 置为正在检索状态
    */
    function startLoad() {
        $(t).addClass("container");
        mask = document.createElement('div');
        $(mask).addClass("mask");
        $(mask).css("height", $(t).height());
        $(t).append(mask);
        $(t + " .pgRefresh").addClass("pgLoad");
        $(t + " .pgSearchInfo").html("正在检索中，请稍后...");
    }

    /**
    * 置为结束检索状态
    */
    function overLoad() {
        $(t + " .pgRefresh").removeClass("pgLoad");
        $(t + " .pgSearchInfo").html('检索到&nbsp;' + totalRecord + '&nbsp;条记录，显示第&nbsp;<span class="pgStartRecord">' + startRecord + '</span>&nbsp;条&nbsp;-&nbsp;第&nbsp;<span class="pgEndRecord">' + endRecord + '</span>&nbsp;条记录');
        $(mask).remove();
        //$(mask).fadeOut("slow");
    }

    /**
    * 获得远程数据
    */
    function getRemoteData() {//debugger;
        startLoad();
        //debugger;
        $.ajax(
			{
			    type: "get",
			    url: proxyUrl + "/Page/" + (currentPage > 0 ? currentPage - 1 : currentPage),
			    cache: false,
			    data: ajaxParam,
			    dataType: "json",
			    timeout: 30000,
			    success: function(table) {
			        getStartEnd();
			        //loadData();
			        //refresh();
			        overLoad();
			        $("#DataList").setTemplateElement("template");
			        $("#DataList").processTemplate(table);
			        $(t).css("text-align", "center");
			        if (totalRecord == 0) {
			            $(t).css("text-align", "center");
			            $(t).css("line-height", "50px");
			            $(t).html("很遗憾，没有检索到任何记录！");
			            //return;
			        }
			        else {
			            $("input[@name=ListViewselectall]").bind("click", function() {

			                $("table.listview").find("input[@type=checkbox]").attr("checked", this.checked);
			            });
			        }
			    },
			    error: function(msg) {
			        //debugger;
			        alert("请求失败或超时，请稍后再试！");
			        overLoad();
			        return;
			    }
			}
		);
    }

    /**
    * 获得当前页开始结束记录
    */
    function getStartEnd() {

        //currentPage=currentPage == 0 ? 1 : currentPage;
        if (groupSize) {
            startRecord = (currentPage - 1) * perPage + 1 - gpStartRecord + 1;
            endRecord = Math.min(currentPage * perPage, totalRecord) - gpStartRecord + 1;
        } else {
            startRecord = (currentPage - 1) * perPage + 1;
            endRecord = Math.min(currentPage * perPage, totalRecord);
        }
    }

    /**
    * 获得当前组开始结束页码
    */
    function getGroupStartEnd() {
        if (groupSize == null)
            return;
        var groupId = Math.ceil(currentPage / groupSize);
        gpStartPage = (groupId - 1) * groupSize + 1;
        gpEndPage = Math.min(groupId * groupSize, totalPage);
        gpStartRecord = (gpStartPage - 1) * perPage + 1;
        gpEndRecord = Math.min(gpEndPage * perPage, totalRecord);
    }

    /**
    * 刷新数据容器  填充数据
    */
    function loadData() {//debugger;

        /*
        $("[@id=ready]").remove();
        //		var view = "";
        //		for(var i=startRecord-1;i<=endRecord-1;i++)
        //			view += dataStore[i];
        //		valContainer.html(view);
        $.each(dataStore, function(i, n) {
        var row = $("#dataTemp").clone();
        //	        row.find("#ID").text(n.ID);
        //	        row.find("#ParentID").text(n.ParentID);
        //	        row.find("#Name").text(n.Name);
        //	        row.find("#IsParent").text(n.IsParent);
        //	        //	        if (n.RequiredDate !== undefined) row.find("#ShippedDate").text(ChangeDate(n.RequiredDate));
        //	        //	        row.find("#ShippedName").text(n.ShipName);
        //	        //	        row.find("#ShippedAddress").text(n.ShipAddress);
        //	        //	        row.find("#ShippedCity").text(n.ShipCity);
        //	        //	        row.find("#more").html("<a href=OrderInfo.aspx?id=" + n.OrderID + "&pageindex=" + pageIndex + ">&nbsp;More</a>");
        //	        row.attr("id", "ready"); //改变绑定好数据的行的id
        //	        row.css("display", ""); 
        ///onSetData(row);
        //debugger;
        onSetData(row, n);
        row.attr("id", "ready"); //改变绑定好数据的行的id
        row.css("display", "");
        $("table.listview").append(row);
        //row.appendTo("#listview"); //添加到模板的容器中
            
        });*/
    }

    /**
    * 刷新工具栏状态
    */
    function refresh() {
        //当前页码写入cookie
        $.cookie(t + '_currentPage', currentPage);
        $.cookie(t + '_perPage', perPage);

        valCurrentPage.val(currentPage);
        valStartRecord.html(startRecord);
        valEndRecord.html(endRecord);
        valTotalPage.html(totalPage);

        btn.unbind("mousedown", pressHandler);
        btn.bind("mouseup", unpressHandler);
        btn.bind("mouseout", unpressHandler);
        if (currentPage == totalPage) {
            enabled();
            btnBack.bind("mousedown", pressHandler);
            btnNext.addClass("pgNextDisabled");
            btnLast.addClass("pgLastDisabled");
        } else if (currentPage == 1) {
            enabled();
            btnGo.bind("mousedown", pressHandler);
            btnPrev.addClass("pgPrevDisabled");
            btnFirst.addClass("pgFirstDisabled");
        } else {
            enabled();
            btnBack.bind("mousedown", pressHandler);
            btnGo.bind("mousedown", pressHandler);
            btnNext.addClass("pgNext");
            btnPrev.addClass("pgPrev");
            btnFirst.addClass("pgFirst");
            btnLast.addClass("pgLast");
        }
    }

    /**
    * 移除按钮disabled状态样式
    */
    function enabled() {
        btnNext.removeClass("pgNextDisabled");
        btnPrev.removeClass("pgPrevDisabled");
        btnFirst.removeClass("pgFirstDisabled");
        btnLast.removeClass("pgLastDisabled");
    }

    /**
    * 添加按钮按下状态样式
    */
    function pressHandler() {
        $(this).addClass("pgPress");
    }

    /**
    * 移除按钮按下状态样式
    */
    function unpressHandler() {
        $(this).removeClass("pgPress");
    }

}